home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
pascal
/
tppcx.exe
/
PCX.INT
< prev
next >
Wrap
Text File
|
1991-01-28
|
6KB
|
180 lines
{══════════════════════════════════════════════════════════════════════════╗
║ MDRUtils/Mark D.Rafn [71530,2307] ║
║ Rt1 Box138A ║
║ Two Harbors, MN 55616 ║
║ 218-834-5154 ║
║ ║
║ Unit for displaying/creating ZSoft PCX format picture files ║
║ Must be in graphics mode. ║
╚══════════════════════════════════════════════════════════════════════════}
{ See EOF for Revision Record }
{$F+,O+,D-,R-,S-}
unit PCX;
interface
uses Graph, EGA;
type
FStr = string[ 50 ];
TripletArray = array[ 0..15,0..2] of byte;
BufferType = array[ 1..128 ] of byte;
OffsetType = array[ 0..479 ] of longint;
PBuf = ^BufferType;
POffset = ^OffsetType;
Header = record
Maker, Version, Encoding, bpp: byte;
xmn, ymn, xmx, ymx, HRes, VRes: integer;
CMap: TripletArray;
Reserved, NPlanes: byte;
NBpl, Palett: integer;
end;
DisplayRec = record
SegBase: word;
Page0, Page1: word;
HorizRes, VertRes, BytesPerLine, NoColors: integer;
end;
{ abstract objext type }
BasePcxPtr = ^BasePcx;
BasePCX = object
PCXError: byte;
Loaded: boolean;
constructor Init;
destructor Done; virtual;
procedure Show( Filename: FStr; PageNo: byte; UsePal: boolean );
procedure GetPicVp( var PicVp: viewporttype );
procedure Save( x1, y1, x2, y2: integer; Filename: FStr );
function GetPCXError: byte;
function GetXmx: integer;
function GetXmn: integer;
function GetYmx: integer;
function GetYmn: integer;
function IsMultiPlane: boolean;
function PCXLoaded: boolean;
PRIVATE
Hdr: Header;
Page: word;
PFile: pointer;
SizeF: longint;
Buf: PBuf;
Offset: POffset;
Display: DisplayRec;
f: file;
procedure OpenFile( Filename: FStr; NewFile: boolean; var OK: boolean );
procedure GetHeader;
procedure SetPal; virtual;
procedure Decode; virtual;
procedure DecodeRow( var Index: integer );
procedure WriteRow( row: integer );
procedure ReadRow( row, sbyt: integer; var inBuf: PBuf );
procedure WriteHeader;
function FillOffsets: boolean; virtual;
function Encode( Srow, Erow: integer; sbyt: byte ): integer; virtual;
function EncPut( byt, cnt: byte ): integer;
function EncodeLine( inBuf: PBuf; inLen: integer ): boolean;
function GetByte( n: integer ): byte;
function GetInteger( n1, n2: integer ): integer;
end; { object }
HercPCXPtr = ^HercPCX;
HercPCX = object( BasePCX )
constructor Init;
destructor Done; virtual;
PRIVATE
procedure Decode; virtual;
procedure GetRow( r, sbyt: integer; var inBuf: PBuf );
function Encode( Srow, Erow: integer; sbyt: byte ): integer; virtual;
function FillOffsets: boolean; virtual;
end; { object }
EgaPCXPtr = ^EgaPCX;
EgaPCX = object( BasePCX )
constructor Init;
destructor Done; virtual;
PRIVATE
procedure SetPal; virtual;
procedure GetRow( Plane, r, sbyt: integer; var inBuf: PBuf );
procedure Decode; virtual;
function FillOffsets: boolean; virtual;
function Encode( Srow, Erow: integer; sbyt: byte ): integer; virtual;
end; { object }
VgaPCXPtr = ^VgaPcx;
VgaPCX = object( EgaPCX );
constructor Init;
destructor Done; virtual;
end;
const
HERC_Attr: DisplayRec = ( SegBase: $B000; Page0: $0000; Page1: $8000;
HorizRes: 720; VertRes: 348; BytesPerLine: 90;
NoColors: 2 );
EGA_Attr: DisplayRec = ( SegBase: $A000; Page0: $0000; Page1: $8000;
HorizRes: 640; VertRes: 350; BytesPerLine: 80;
NoColors: 16 );
PCXError0: byte = 0; { no error }
PCXError1: byte = 1; { File not found }
PCXError2: byte = 2; { Not enough memory for picture buffer }
PCXError3: byte = 3; { Error reading PCX file into RAM }
PCXError4: byte = 4; { Multi-plane image encountered,display adapter for single plane only }
PCXError5: byte = 5; { Not a valid PCX file }
PCXError6: byte = 6; { Incorrect PCX version. Must be v3.0 or greater }
PCXError7: byte = 7; { Not enough memory for Offset Buffer }
PCXError8: byte = 8; { unable to open new file }
PCXError9: byte = 9; { Encoding error }
PCXError10: byte = 10; { Image exceeds 64k limit }
PCXError11: byte = 11; { Image exceeds display capabilities }
Zero: byte = 0;
dMaker: byte = 10;
dVersion: byte = 5;
dEncoding: byte = 1;
dbpp: byte = 1;
dPallet: integer = 1;
dFillSize = 58;
EGATriplet: TripletArray = ( { 48byte default EGA/VGA palette}
($00, $00, $00), { black }
($00, $00, $AA), { blue }
($00, $AA, $00), { green }
($00, $AA, $AA), { cyan }
($AA, $00, $00), { red }
($AA, $00, $AA), { magenta }
($AA, $55, $00), { brown }
($AA, $AA, $AA), { lightgray }
($55, $55, $55), { darkgray }
($00, $00, $FF), { lightblue }
($00, $FF, $00), { lightgreen }
($00, $FF, $FF), { lightcyan }
($FF, $00, $00), { lightred }
($FF, $00, $FF), { lightmagenta }
($FF, $FF, $00), { yellow }
($FF, $FF, $FF) );{ white }
MDATriplet: TripletArray = ( {48 byte default MDA palette entry for header }
($00, $00, $00), { black }
($FF, $FF, $FF), { white }
($00, $00, $00), { remaining = filler }
($00, $00, $00),
($00, $00, $00),
($00, $00, $00),
($00, $00, $00),
($00, $00, $00),
($00, $00, $00),
($00, $00, $00),
($00, $00, $00),
($00, $00, $00),
($00, $00, $00),
($00, $00, $00),
($00, $00, $00),
($00, $00, $00));
{══════════════════════════════════════════════════════════════════════════╗
╚══════════════════════════════════════════════════════════════════════════}
implementation